home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / packet / p_aa4re / bb212src / bbmisci.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-03-22  |  21.5 KB  |  727 lines

  1. (*===========================================================================*)
  2. (* Procedure for initialize and shutdown                                     *)
  3. (*                                                                           *)
  4. (*   Copyright 1988, 1989, 1990, 1991, 1992 by H. Roy Engehausen.  All       *)
  5. (*   rights reserved.                                                        *)
  6. (*                                                                           *)
  7. (*===========================================================================*)
  8.  
  9. {$O+} {This procedure gets overlayed}
  10. {$F+} {Force all far calls}
  11.  
  12. {$UNDEF  DEBUG1}  (* Shows progress thru the start code *)
  13. {$UNDEF  DEBUG2}  (* Shows progress of heap *)
  14. {$UNDEF  DEBUG3}  (* Shows progress thru the end code *)
  15. {$DEFINE POINT_CHK}
  16.  
  17. {$DEFINE TEST_VER} (* Display test version message *)
  18. {$UNDEF TEST_VER}  (* Don't display test version message *)
  19.  
  20. UNIT BBMISCI;
  21.  
  22. INTERFACE
  23.  
  24.   PROCEDURE main_init;
  25.   PROCEDURE main_close;
  26.   PROCEDURE log_sync;
  27.   PROCEDURE sema_clear_all;
  28.   PROCEDURE shutdown_bbs;
  29.  
  30. IMPLEMENTATION
  31.  
  32. USES
  33.   CRT,
  34.   DOS,
  35.   OVERLAY,
  36.   bbaux,
  37.   bbbidaux,
  38.   bbcaptur,
  39.   bbconsl,
  40.   bbdummy,
  41.   bbdump,
  42.   bbfnr,
  43.   bbfsm,
  44.   bbfwdd,
  45.   bbinit,
  46.   bblog,
  47.   bbmf,
  48.   bbmfi,
  49.   bbminit,
  50.   bbmisc3,
  51.   bbmon,
  52.   bbover,
  53.   bbsema2,
  54.   bbstack,
  55.   bbtask,
  56.   bbtime,
  57.   bbuf,
  58.   bbwakeup,
  59.   bbwin,
  60.   match;
  61.  
  62. (*===========================================================================*)
  63. (* Routeine to initialize things                                             *)
  64. (*===========================================================================*)
  65.  
  66. {$I BBTASKI}  (* Task switcher initialization *)
  67.  
  68. {$I BBLOGI}   (* Log init, close, sync *)
  69.  
  70. {$I BBUFI}    (* User init *)
  71.  
  72. {$I BBSEMAI}  (* Semaphore init *)
  73.  
  74. {$I BBWINIT}  (* Window init *)
  75.  
  76. {$I BBOINIT}  (* Option init *)
  77.  
  78. {$I MATCHI}   (* Match init *)
  79.  
  80. (*===========================================================================*)
  81. (* Initialize the time                                                       *)
  82. (*===========================================================================*)
  83.  
  84. {$F+} {Force all far calls}
  85.  
  86. PROCEDURE time_init;
  87.  
  88.   BEGIN;
  89.  
  90.     up_days := 0;
  91.  
  92.     up_time := 0;
  93.  
  94.     GETTIME(today_time.hour, today_time.min, today_time.sec, sec100);
  95.  
  96.     get_up_time;
  97.  
  98.     new_date;
  99.  
  100.     last_min             := today_time.min;
  101.  
  102.     last_hours           := today_time.hour;
  103.  
  104.     status_window_change := TRUE;
  105.  
  106.   END;
  107.  
  108. (*===========================================================================*)
  109. (* Main initialize                                                           *)
  110. (*===========================================================================*)
  111.  
  112. PROCEDURE main_init;
  113.  
  114.   PROCEDURE clear_heap;
  115.  
  116.     TYPE
  117.       dt = RECORD
  118.              area : POINTER;
  119.              len  : WORD;
  120.            END;
  121.  
  122.     VAR
  123.       i : LONGINT;
  124.       j : BYTE;
  125.       k : WORD;
  126.       p : ARRAY[1..100] OF dt;
  127.  
  128.      BEGIN;
  129.  
  130.        j := 0;
  131.        i := MAXAVAIL;
  132.  
  133.        WHILE i > 0 DO
  134.          BEGIN;
  135.  
  136.            IF i < 65000 THEN
  137.              k := i
  138.            ELSE
  139.              k := 65000;
  140.  
  141.            INC(j);
  142.  
  143.            WITH p[j] DO
  144.              BEGIN;
  145.                GETMEM(area, k);
  146.                len := k;
  147.                FILLCHAR(area^, k, 0);
  148.              END;
  149.  
  150.            i := MAXAVAIL;
  151.  
  152.          END;
  153.  
  154.        WHILE j > 0 DO
  155.          BEGIN;
  156.            WITH p[j] DO
  157.              FREEMEM(area, len);
  158.            DEC(j);
  159.          END;
  160.  
  161.     END;
  162.  
  163.   BEGIN;
  164.  
  165.     (*-----------------------------------------------------------------------*)
  166.     (* Copyright                                                             *)
  167.     (*-----------------------------------------------------------------------*)
  168.  
  169.     CLRSCR;
  170.     WRITELN;
  171.     WRITELN(this_bbs_version);
  172.     WRITELN('Copyright 1988, 1989, 1990, 1991 by H.R. Engehausen.            ');
  173.     WRITELN('All rights reserved.                                            ');
  174.  
  175.     {$IFDEF TEST_VER}
  176.     WRITELN;
  177.     WRITELN('                     ****** WARNING ******                      ');
  178.     WRITELN;
  179.     WRITELN('This is a test version. I expect it to have problems so be      ');
  180.     WRITELN('prepared.  Any problem reports or comments will be welcome.  If ');
  181.     WRITELN('this copy is more than two or three weeks old then it is        ');
  182.     WRITELN('obsolete and you need a newer copy.  When the fully supported   ');
  183.     WRITELN('version (2.12) is released, please switch as soon as possible.  ');
  184.  
  185.     IF this_bbs_handshake[10] < 'A' THEN
  186.       BEGIN;
  187.         WRITELN;
  188.         WRITELN('******** VIRUS ********');
  189.         WRITELN;
  190.         WRITELN('A virus has infected this program');
  191.         SOUND(440);
  192.         DELAY(2000);
  193.         NOSOUND;
  194.         HALT;
  195.       END;
  196.     {$ENDIF}
  197.  
  198.     (*-----------------------------------------------------------------------*)
  199.     (* Overlay size please                                                   *)
  200.     (*-----------------------------------------------------------------------*)
  201.  
  202.     WRITELN;
  203.     WRITELN('Overlay buffer size is ', OVRGETBUF);
  204.  
  205.     (*-----------------------------------------------------------------------*)
  206.     (* Set OVR retry                                                         *)
  207.     (*-----------------------------------------------------------------------*)
  208.  
  209.     OVRSETRETRY(OVRGETBUF DIV 10);
  210.  
  211.     (*-----------------------------------------------------------------------*)
  212.     (* Initialize match                                                      *)
  213.     (*-----------------------------------------------------------------------*)
  214.  
  215.     match_init;
  216.  
  217.     (*-----------------------------------------------------------------------*)
  218.     (* Let them digest that                                                  *)
  219.     (*-----------------------------------------------------------------------*)
  220.  
  221.     DELAY(1000);
  222.  
  223.     (*-----------------------------------------------------------------------*)
  224.     (* A quick init                                                          *)
  225.     (*-----------------------------------------------------------------------*)
  226.  
  227.     pointer_bottom_l := main_cs * 16;
  228.     pointer_bottom_p := PTR(main_cs, 0);
  229.  
  230.     {$IFDEF VER55}
  231.       pointer_top_p    := FREEPTR;
  232.  
  233.       IF OFS(pointer_top_p^) = 0 THEN
  234.         pointer_top_p := PTR(SEG(pointer_top_p^) + $1000, 0);
  235.     {$ELSE}
  236.       pointer_top_p    := HEAPEND;
  237.     {$ENDIF}
  238.  
  239.     pointer_top_l    := OFS(pointer_top_p^)
  240.                                           + LONGINT(16) * SEG(pointer_top_p^);
  241.  
  242.     {$IFNDEF VER55}
  243.       heaporg_l := OFS(HeapOrg^) + LONGINT(16) * SEG(HeapOrg^);
  244.     {$ENDIF}
  245.  
  246.     (*-----------------------------------------------------------------------*)
  247.     (* Zero memory                                                           *)
  248.     (*-----------------------------------------------------------------------*)
  249.  
  250.     (* clear_heap; *)
  251.  
  252.     (*-----------------------------------------------------------------------*)
  253.     (* Minor inits                                                           *)
  254.     (*-----------------------------------------------------------------------*)
  255.  
  256.     edit_window_busy    := FALSE;
  257.  
  258.     msg_route_list      := NIL;
  259.     msg_route_num       := 0;
  260.     msg_route_force     := FALSE;
  261.  
  262.     alias_list          := NIL;
  263.  
  264.     wakeup_force        := FALSE;
  265.  
  266.     fwd_out_busy        := FALSE;
  267.  
  268.     last_h_msg          := 0;
  269.  
  270.     first_msg_action    := NIL;
  271.  
  272.     wakeup_shut_sw      := FALSE;
  273.  
  274.     found_mon           := FALSE;
  275.  
  276.     dis_area            := NIL;
  277.  
  278.     edit_operation      := 0;
  279.  
  280.     fnm_linked_list_valid := FALSE;
  281.  
  282.     RANDOMIZE;
  283.  
  284.     (*-----------------------------------------------------------------------*)
  285.     (* Initialize the dump system                                            *)
  286.     (*-----------------------------------------------------------------------*)
  287.  
  288.     dump_init;
  289.  
  290.     (*-----------------------------------------------------------------------*)
  291.     (* Initialize operator session                                           *)
  292.     (*-----------------------------------------------------------------------*)
  293.  
  294.     operator_init_session;
  295.  
  296.     (*-----------------------------------------------------------------------*)
  297.     (* Initialize the locks                                                  *)
  298.     (*-----------------------------------------------------------------------*)
  299.  
  300.     {$IFDEF DEBUG1}
  301.       WRITELN('Semaphore init');
  302.       {$IFDEF DEBUG2}
  303.         dump_string('Semaphore init');
  304.         dump_free_list;
  305.         DELAY(1000);
  306.       {$ENDIF}
  307.     {$ENDIF}
  308.  
  309.     sema_clear_all;
  310.  
  311.     (*-----------------------------------------------------------------------*)
  312.     (* Set the clocks                                                        *)
  313.     (*-----------------------------------------------------------------------*)
  314.  
  315.     {$IFDEF DEBUG1}
  316.       WRITELN('Time init');
  317.       {$IFDEF DEBUG2}
  318.         dump_string('Time init');
  319.         dump_free_list;
  320.         DELAY(1000);
  321.       {$ENDIF}
  322.     {$ENDIF}
  323.  
  324.     time_init;
  325.  
  326.     (*-----------------------------------------------------------------------*)
  327.     (* Load options                                                          *)
  328.     (*-----------------------------------------------------------------------*)
  329.  
  330.     {$IFDEF DEBUG1}
  331.       WRITELN('Option init');
  332.       (* wakeup_time := 0;
  333.          REPEAT
  334.            INC(wakeup_time);
  335.          UNTIL wakeup_time > $FFFFFF; *)
  336.       {$IFDEF DEBUG2}
  337.         dump_string('Option init');
  338.         dump_free_list;
  339.         DELAY(1000);
  340.       {$ENDIF}
  341.     {$ENDIF}
  342.  
  343.     option_init;
  344.  
  345.     (*-----------------------------------------------------------------------*)
  346.     (* Set the mono signal location                                          *)
  347.     (*-----------------------------------------------------------------------*)
  348.  
  349.     IF opt_block.opt_mono_tcb_trace THEN
  350.       signal_place := PTR($B000, (160 * 11) + 2)
  351.     ELSE
  352.       signal_place := @signal_dummy;
  353.  
  354.     signal_place^ := ORD('X') + $7800;
  355.  
  356.     (*-----------------------------------------------------------------------*)
  357.     (* Trace bringup                                                         *)
  358.     (*-----------------------------------------------------------------------*)
  359.  
  360.     {$IFDEF DEBUG1}
  361.       WRITELN('Trace init');
  362.       {$IFDEF DEBUG2}
  363.         dump_string('Trace init');
  364.         dump_free_list;
  365.       {$ENDIF}
  366.     {$ENDIF}
  367.  
  368.     IF opt_block.opt_trace THEN
  369.       BEGIN;
  370.  
  371.         NEW(trace_file);
  372.  
  373.         ASSIGN(trace_file^, opt_block.trace_file_name);
  374.         REWRITE(trace_file^);
  375.  
  376.         trace_count := 0;
  377.       END
  378.     ELSE
  379.       trace_file := NIL;
  380.  
  381.     (*-----------------------------------------------------------------------*)
  382.     (* Schedule WAKEUP in one minute                                         *)
  383.     (*-----------------------------------------------------------------------*)
  384.  
  385.     {$IFDEF DEBUG1}
  386.       WRITELN('Wakeup init');
  387.       {$IFDEF DEBUG2}
  388.         dump_string('Wakeup init');
  389.         dump_free_list;
  390.       {$ENDIF}
  391.     {$ENDIF}
  392.  
  393.     IF opt_block.wakeup_fn = '' THEN
  394.       wakeup_time := $7FFFFFFF
  395.     ELSE
  396.       wakeup_time := current_day_time + ticks_per_min;
  397.  
  398.     (*-----------------------------------------------------------------------*)
  399.     (* Turn capture off                                                      *)
  400.     (*-----------------------------------------------------------------------*)
  401.  
  402.     capture_this_window := $FF;
  403.  
  404.     (*-----------------------------------------------------------------------*)
  405.     (* Start log                                                             *)
  406.     (*-----------------------------------------------------------------------*)
  407.  
  408.     {$IFDEF DEBUG1}
  409.       WRITELN('Log init');
  410.       {$IFDEF DEBUG2}
  411.         dump_string('Log init');
  412.         dump_free_list;
  413.       {$ENDIF}
  414.     {$ENDIF}
  415.  
  416.     log_init;
  417.  
  418.     (*-----------------------------------------------------------------------*)
  419.     (* Start windows                                                         *)
  420.     (*-----------------------------------------------------------------------*)
  421.  
  422.     {$IFDEF DEBUG1}
  423.       WRITELN('Window init');
  424.       DELAY(2000);
  425.       {$IFDEF DEBUG2}
  426.         dump_string('Window init');
  427.         dump_free_list;
  428.       {$ENDIF}
  429.     {$ENDIF}
  430.  
  431.     window_init;
  432.  
  433.     (*-----------------------------------------------------------------------*)
  434.     (* Show we are in system startup for tasks                               *)
  435.     (*-----------------------------------------------------------------------*)
  436.  
  437.     system_startup := TRUE;
  438.  
  439.     (*-----------------------------------------------------------------------*)
  440.     (* Ready tasks                                                           *)
  441.     (*-----------------------------------------------------------------------*)
  442.  
  443.     {$IFDEF DEBUG1}
  444.       WRITELN('Task init');
  445.       DELAY(2000);
  446.       {$IFDEF DEBUG2}
  447.         dump_string('Task init');
  448.         dump_free_list;
  449.       {$ENDIF}
  450.     {$ENDIF}
  451.  
  452.     task_init;
  453.  
  454.     (*-----------------------------------------------------------------------*)
  455.     (* Load the messages                                                     *)
  456.     (*-----------------------------------------------------------------------*)
  457.  
  458.     {$IFDEF DEBUG1}
  459.       WRITELN('Message init');
  460.       DELAY(2000);
  461.     {$ENDIF}
  462.  
  463.     message_init(TRUE);
  464.  
  465.     (*-----------------------------------------------------------------------*)
  466.     (* Load the bids                                                         *)
  467.     (*-----------------------------------------------------------------------*)
  468.  
  469.     {$IFDEF DEBUG1}
  470.       WRITELN('Bid init');
  471.       DELAY(2000);
  472.       {$IFDEF DEBUG2}
  473.         dump_string('Bid init');
  474.         dump_free_list;
  475.       {$ENDIF}
  476.     {$ENDIF}
  477.  
  478.     bid_init;
  479.  
  480.     (*-----------------------------------------------------------------------*)
  481.     (* Load the msgs                                                         *)
  482.     (*-----------------------------------------------------------------------*)
  483.  
  484.     {$IFDEF DEBUG1}
  485.       WRITELN('Msg init');
  486.       DELAY(1000);
  487.       {$IFDEF DEBUG2}
  488.         dump_string('Msg init');
  489.         dump_free_list;
  490.       {$ENDIF}
  491.     {$ENDIF}
  492.  
  493.     open_msg;
  494.  
  495.     (*-----------------------------------------------------------------------*)
  496.     (* Load the user index                                                   *)
  497.     (*-----------------------------------------------------------------------*)
  498.  
  499.     {$IFDEF DEBUG1}
  500.       WRITELN('User init');
  501.       DELAY(1000);
  502.       {$IFDEF DEBUG2}
  503.         dump_string('User init');
  504.         dump_free_list;
  505.       {$ENDIF}
  506.     {$ENDIF}
  507.  
  508.     open_uid(opt_block.user_file_name);
  509.  
  510.     (*-----------------------------------------------------------------------*)
  511.     (* Ready monitor                                                         *)
  512.     (*-----------------------------------------------------------------------*)
  513.  
  514.     {$IFDEF DEBUG1}
  515.       WRITELN('Monitor init');
  516.       DELAY(1000);
  517.       {$IFDEF DEBUG2}
  518.         dump_string('Monitor init');
  519.         dump_free_list;
  520.       {$ENDIF}
  521.     {$ENDIF}
  522.  
  523.     monitor_init;
  524.  
  525.     (*-----------------------------------------------------------------------*)
  526.     (* Bring up everything else                                              *)
  527.     (*-----------------------------------------------------------------------*)
  528.  
  529.     {$IFDEF DEBUG1}
  530.       WRITELN('Main init');
  531.       DELAY(1000);
  532.       {$IFDEF DEBUG2}
  533.         dump_string('Main init');
  534.         dump_free_list;
  535.       {$ENDIF}
  536.     {$ENDIF}
  537.  
  538.     initialize;
  539.  
  540.     {$IFDEF DEBUG1}
  541.       WRITELN('Init done');
  542.       DELAY(1000);
  543.       {$IFDEF DEBUG2}
  544.         dump_string('Init done');
  545.         dump_free_list;
  546.       {$ENDIF}
  547.     {$ENDIF}
  548.  
  549.     (*-----------------------------------------------------------------------*)
  550.     (* We are done in system startup for tasks                               *)
  551.     (*-----------------------------------------------------------------------*)
  552.  
  553.     system_startup := FALSE;
  554.  
  555.   END;
  556.  
  557. (*===========================================================================*)
  558. (* Close things up                                                           *)
  559. (*===========================================================================*)
  560.  
  561. PROCEDURE main_close;
  562.  
  563.   VAR
  564.     b : BOOLEAN;
  565.     i : INTEGER;
  566.     t : tcb_ptr;
  567.  
  568.   BEGIN;
  569.  
  570.     (*-----------------------------------------------------------------------*)
  571.     (* Close TNCs                                                            *)
  572.     (*-----------------------------------------------------------------------*)
  573.  
  574.     {$IFDEF DEBUG3}
  575.       WRITELN('Tclose');
  576.       DELAY(1000);
  577.     {$ENDIF}
  578.  
  579.     tclose;
  580.  
  581.     (*-----------------------------------------------------------------------*)
  582.     (* Close monitor                                                         *)
  583.     (*-----------------------------------------------------------------------*)
  584.  
  585.     {$IFDEF DEBUG3}
  586.       WRITELN('Monitor close');
  587.       DELAY(1000);
  588.     {$ENDIF}
  589.  
  590.     monitor_up;
  591.  
  592.     (*-----------------------------------------------------------------------*)
  593.     (* Close userfile                                                        *)
  594.     (*-----------------------------------------------------------------------*)
  595.  
  596.     {$IFDEF DEBUG3}
  597.       WRITELN('UID close');
  598.       DELAY(1000);
  599.     {$ENDIF}
  600.  
  601.     close_uid;
  602.  
  603.     (*-----------------------------------------------------------------------*)
  604.     (* Close msgs                                                            *)
  605.     (*-----------------------------------------------------------------------*)
  606.  
  607.     {$IFDEF DEBUG3}
  608.       WRITELN('MSG close');
  609.       DELAY(1000);
  610.     {$ENDIF}
  611.  
  612.     (* close_msg; *)
  613.  
  614.     (*-----------------------------------------------------------------------*)
  615.     (* Close windows                                                         *)
  616.     (*-----------------------------------------------------------------------*)
  617.  
  618.     {$IFDEF DEBUG3}
  619.       WRITELN('Window close');
  620.       DELAY(1000);
  621.     {$ENDIF}
  622.  
  623.     window_close;
  624.  
  625.     (*-----------------------------------------------------------------------*)
  626.     (* Close capture file                                                    *)
  627.     (*-----------------------------------------------------------------------*)
  628.  
  629.     {$IFDEF DEBUG3}
  630.       WRITELN('Capture close');
  631.       DELAY(1000);
  632.     {$ENDIF}
  633.  
  634.     capture_close;
  635.  
  636.     (*-----------------------------------------------------------------------*)
  637.     (* Close log                                                             *)
  638.     (*-----------------------------------------------------------------------*)
  639.  
  640.     {$IFDEF DEBUG3}
  641.       WRITELN('Log close');
  642.       DELAY(1000);
  643.     {$ENDIF}
  644.  
  645.     log_close;
  646.  
  647.     (*-----------------------------------------------------------------------*)
  648.     (* Close trace                                                           *)
  649.     (*-----------------------------------------------------------------------*)
  650.  
  651.     {$IFDEF DEBUG3}
  652.       WRITELN('Trace close');
  653.       DELAY(1000);
  654.     {$ENDIF}
  655.  
  656.     IF opt_block.opt_trace THEN
  657.       BEGIN;
  658.  
  659.         t := ring_tcb;
  660.         REPEAT
  661.           stack_record(t);
  662.           t := t^.next_tcb;
  663.         UNTIL t = ring_tcb;
  664.  
  665.         {$I-}
  666.         CLOSE(trace_file^);
  667.         {$I+}
  668.         i := IORESULT;
  669.       END;
  670.  
  671.     (*-----------------------------------------------------------------------*)
  672.     (* Close comple                                                          *)
  673.     (*-----------------------------------------------------------------------*)
  674.  
  675.     {$IFDEF DEBUG3}
  676.       WRITELN('Close complete');
  677.       DELAY(1000);
  678.     {$ENDIF}
  679.  
  680.   END;
  681.  
  682. (*===========================================================================*)
  683. (* Shutdown the BBS                                                          *)
  684. (*===========================================================================*)
  685.  
  686. PROCEDURE shutdown_bbs;
  687.  
  688.   VAR
  689.     b : BOOLEAN;
  690.     i : BYTE;
  691.  
  692.   BEGIN;
  693.  
  694.     (*-----------------------------------------------------------------------*)
  695.     (* Obtain the interrupt lock                                             *)
  696.     (*-----------------------------------------------------------------------*)
  697.  
  698.     get_semaphore(semaphore_interrupts, sem_exclusive, FALSE);
  699.  
  700.     (*-----------------------------------------------------------------------*)
  701.     (* Let everything die away                                               *)
  702.     (*-----------------------------------------------------------------------*)
  703.  
  704.     FOR i := 1 TO 20 DO
  705.       task_switch;
  706.  
  707.     (*-----------------------------------------------------------------------*)
  708.     (* Shut system down                                                      *)
  709.     (*-----------------------------------------------------------------------*)
  710.  
  711.     shutdown_switch := TRUE;
  712.  
  713.     (*-----------------------------------------------------------------------*)
  714.     (* Release all locks                                                     *)
  715.     (*-----------------------------------------------------------------------*)
  716.  
  717.     sema_clear_all;
  718.  
  719.     (*-----------------------------------------------------------------------*)
  720.     (* Done                                                                  *)
  721.     (*-----------------------------------------------------------------------*)
  722.  
  723.     task_switch;
  724.  
  725.   END;
  726. END.
  727.